﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DAL;
using DataAccessComponents;
using System.Collections.ObjectModel;

namespace BusinessLogicLayer
{
    public class HotelBL : IBusinessLogicLayer<Hotel>
    {
        private DbOperations dal = new DbOperations();

        /// <summary>
        /// Funkcja dodawająca hotel do bazy danych
        /// </summary>
        /// <param name="objDodaj">Obiekt Hotel</param>
        /// <returns></returns>
        public int dodaj(Hotel objDodaj)
        {
            GaleriaBL galeriaBL = new GaleriaBL();
            int idGaleria = galeriaBL.dodaj(objDodaj.Galeria);
            objDodaj.Id_galeria = idGaleria;

            return dal.dodajHotel(objDodaj);
        }

        /// <summary>
        /// Funkcja usuwająca hotel z bazy danych
        /// </summary>
        /// <param name="idusun">Id hotelu do usunięcia</param>
        public void usun(int idusun)
        {

            Hotel hotel = this.pobierz(idusun);

            OfertaBL ofertaBL = new OfertaBL();
            TerminBL terminBL = new TerminBL();

            ObservableCollection<Termin> listaTerminowDlaHotelu = terminBL.pobierzListeDlaHotelu(idusun);
            foreach (Termin termin in listaTerminowDlaHotelu)
            {
                ofertaBL.usun(termin.Oferta.Id_oferta);
            }
            // Usuwanie hotelu
            dal.usunHotel(idusun);           

            GaleriaBL galeriaBL = new GaleriaBL();
            galeriaBL.usun(hotel.Id_galeria);         
            
        }

        /// <summary>
        /// Funkcja akutualizująca hotel w bazie danych
        /// </summary>
        /// <param name="objAktualizuj">Obiekt hotel zawierający inforamacje do aktualizacji</param>
        public void aktualizuj(Hotel objAktualizuj)
        {
            dal.aktualizujHotel(objAktualizuj);
            //Aktulizowanie informacji o galerii
            GaleriaBL galeriaBL = new GaleriaBL();
            galeriaBL.aktualizuj(objAktualizuj.Galeria);
            //Aktualizacja informacjio o mieście
            MiastoBL miastoBL = new MiastoBL();
            miastoBL.aktualizuj(objAktualizuj.Miasto);
            
        }

        /// <summary>
        /// Pobiera hotel na podstawie id hotel
        /// </summary>
        /// <param name="idpobierz">Id hotel</param>
        /// <returns>Obiekt Hotel</returns>
        public Hotel pobierz(int idpobierz)
        {
            Hotel hotel = dal.pobierzHotel(idpobierz);

            //pobranie inforamcji o galerii hotelu
            GaleriaBL galeriaBL =new GaleriaBL();            
            hotel.Galeria = galeriaBL.pobierz(hotel.Id_galeria);

            //pobieranie inforamcji o mieście w którym znajduje się hotel
            MiastoBL miastoBL = new MiastoBL();
            hotel.Miasto = miastoBL.pobierz(hotel.Id_miasta);

            //pobieranie informacji o wyzywieniu
            WyzywienieBL wyzywienieBL = new WyzywienieBL();
            hotel.Wyzywienie = wyzywienieBL.pobierz(hotel.Id_wyzywienie);

            //pobieranie objAktualizuj głownego hotelu
            ZdjecieBL zdjecieBL = new ZdjecieBL();
            hotel.ZdjecieGlowne = zdjecieBL.pobierzBitmapImage(galeriaBL.pobierzZdjecieGlowneGaleria(hotel.Id_galeria).Id_zdjecia);
            hotel.IdzdjecieGlowne = galeriaBL.pobierzZdjecieGlowneGaleria(hotel.Id_galeria).Id_zdjecia;
            return hotel;

        }
        /// <summary>
        /// Funkcja zwraca liste wszystkich hoteli
        /// </summary>
        /// <returns>ObservableCollection Hotel </returns>
        public ObservableCollection<Hotel> pobierzListe()
        {
            ObservableCollection<Hotel> listaHotel = dal.pobierzListeHotel();
            GaleriaBL galeriaBL = new GaleriaBL();
            MiastoBL miastoBL = new MiastoBL();
            ZdjecieBL zdjecieBL = new ZdjecieBL();
            WyzywienieBL wyzywienieBL = new WyzywienieBL();

            foreach (Hotel hotel in listaHotel)
            {
                //pobranie inforamcji o galerii hotelu                
                hotel.Galeria = galeriaBL.pobierz(hotel.Id_galeria);

                //pobieranie inforamcji o mieście w którym znajduje się hotel                
                hotel.Miasto = miastoBL.pobierz(hotel.Id_miasta);

                //pobieranie informacji o wyzywieniu
                hotel.Wyzywienie = wyzywienieBL.pobierz(hotel.Id_wyzywienie);

                //pobieranie zdjec głownego hotelu
                hotel.ZdjecieGlowne = zdjecieBL.pobierzBitmapImage(galeriaBL.pobierzZdjecieGlowneGaleria(hotel.Id_galeria).Id_zdjecia);
                hotel.IdzdjecieGlowne = galeriaBL.pobierzZdjecieGlowneGaleria(hotel.Id_galeria).Id_zdjecia;
            }

            return listaHotel;
        }

        /// <summary>
        /// Funkcja zwraca liste hoteli w miescie o id podanym w parametrze
        /// </summary>
        /// <param name="idmiasta">Id miasta</param>
        /// <returns>ObservableCollection Hotel</returns>
        public ObservableCollection<Hotel> pobierzListe(int idmiasta)
        {
            ObservableCollection<Hotel> listaHotel = dal.pobierzListeHotel(idmiasta);
            GaleriaBL galeriaBL = new GaleriaBL();
            MiastoBL miastoBL = new MiastoBL();
            ZdjecieBL zdjecieBL = new ZdjecieBL();
            WyzywienieBL wyzywienieBL = new WyzywienieBL();
            foreach (Hotel hotel in listaHotel)
            {
                //pobranie inforamcji o galerii hotelu                
                hotel.Galeria = galeriaBL.pobierz(hotel.Id_galeria);

                //pobieranie inforamcji o mieście w którym znajduje się hotel                
                hotel.Miasto = miastoBL.pobierz(hotel.Id_miasta);

                //pobieranie informacji o wyzywieniu
                hotel.Wyzywienie = wyzywienieBL.pobierz(hotel.Id_wyzywienie);

                //pobieranie zdjec głownego hotelu
                hotel.ZdjecieGlowne = zdjecieBL.pobierzBitmapImage(galeriaBL.pobierzZdjecieGlowneGaleria(hotel.Id_galeria).Id_zdjecia);
                hotel.IdzdjecieGlowne = galeriaBL.pobierzZdjecieGlowneGaleria(hotel.Id_galeria).Id_zdjecia;
            }

            return listaHotel;
        }

        /// <summary>
        /// Funkcja zwraca liste hoteli w miescie o oraz najbliższego możliwego terminu
        /// </summary>
        
        /// <returns>ObservableCollection Hotel</returns>
        public ObservableCollection<Hotel> pobierzListeZTerminem()
        {
            ObservableCollection<Hotel> listaHotel = dal.pobierzListeHotelZTerminem();
            GaleriaBL galeriaBL = new GaleriaBL();
            MiastoBL miastoBL = new MiastoBL();
            ZdjecieBL zdjecieBL = new ZdjecieBL();
            WyzywienieBL wyzywienieBL = new WyzywienieBL();
            TerminBL terminBL = new TerminBL();
            foreach (Hotel hotel in listaHotel)
            {
                //pobranie inforamcji o galerii hotelu                
                hotel.Galeria = galeriaBL.pobierz(hotel.Id_galeria);

                //pobieranie inforamcji o mieście w którym znajduje się hotel                
                hotel.Miasto = miastoBL.pobierz(hotel.Id_miasta);

                //pobieranie informacji o wyzywieniu
                hotel.Wyzywienie = wyzywienieBL.pobierz(hotel.Id_wyzywienie);

                hotel.Termin = terminBL.pobierz(hotel.Id_termin);

                //pobieranie zdjec głownego hotelu
                hotel.ZdjecieGlowne = zdjecieBL.pobierzBitmapImage(galeriaBL.pobierzZdjecieGlowneGaleria(hotel.Id_galeria).Id_zdjecia);
                hotel.IdzdjecieGlowne = galeriaBL.pobierzZdjecieGlowneGaleria(hotel.Id_galeria).Id_zdjecia;
            }

            return listaHotel;
        }

        /// <returns>ObservableCollection Hotel</returns>
        public ObservableCollection<Hotel> pobierzListeZTerminemAllInclusive()
        {
            ObservableCollection<Hotel> listaHotel = new ObservableCollection<Hotel>();
            GaleriaBL galeriaBL = new GaleriaBL();
            MiastoBL miastoBL = new MiastoBL();
            ZdjecieBL zdjecieBL = new ZdjecieBL();
            WyzywienieBL wyzywienieBL = new WyzywienieBL();
            TerminBL terminBL = new TerminBL();
            foreach (Hotel hotel in dal.pobierzListeHotelZTerminem())
            {
                if (hotel.Id_wyzywienie == 1)
                {
                    //pobranie inforamcji o galerii hotelu                
                    hotel.Galeria = galeriaBL.pobierz(hotel.Id_galeria);

                    //pobieranie inforamcji o mieście w którym znajduje się hotel                
                    hotel.Miasto = miastoBL.pobierz(hotel.Id_miasta);

                    //pobieranie informacji o wyzywieniu
                    hotel.Wyzywienie = wyzywienieBL.pobierz(hotel.Id_wyzywienie);

                    hotel.Termin = terminBL.pobierz(hotel.Id_termin);

                    //pobieranie zdjec głownego hotelu
                    hotel.ZdjecieGlowne = zdjecieBL.pobierzBitmapImage(galeriaBL.pobierzZdjecieGlowneGaleria(hotel.Id_galeria).Id_zdjecia);
                    hotel.IdzdjecieGlowne = galeriaBL.pobierzZdjecieGlowneGaleria(hotel.Id_galeria).Id_zdjecia;

                    listaHotel.Add(hotel);
                }
            }

            return listaHotel;
        }

        public bool aktualizujListe(ObservableCollection<Hotel> lista)
        {
            foreach (Hotel hotel in lista)
            {
                this.aktualizuj(hotel);
            }
            return true;
        }

        public bool usun(ObservableCollection<Hotel> lista)
        {
            foreach (Hotel hotel in lista)
            {
                this.usun(hotel.Id_hotelu);
            }
            return true;
        }


     
    }
}
